Python 組み込み関数 property
property() を デコレータ として使えば、読み出し専用 property を作るのは容易です:
@property デコレータは voltage() を同じ名前のまま 読み出し専用属性の "getter" にし
code:read_only_property_class.py
class Parrot:
def __init__(self) -> None:
self._voltage = 100000
@property # デコレータなのでvoltageを置き換えている(前後に処理を追加)
def voltage(self):
return self._voltage
code:read_only_property.py
>> p = Parrot()
>> p.voltage # 関数定義だが、属性のように使える(プロパティ)
100000
>> p._voltage
100000
>> p.voltage = 10
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute 'voltage'
>> p._voltage = 10 # 元の属性にはアクセスできるので、書き換えることができてしまう
>> p.voltage
10
property オブジェクトは getter, setter, deleter メソッドを持っています。これらのメソッドをデコレータとして使うと、対応するアクセサ関数がデコレートされた関数に設定された、 property のコピーを作成できます。
上の例を拡張して説明すると、@voltage.setter、@voltage.deleterをつけたvoltage関数
追加の関数には、必ず元の property と同じ名前 (この例では x) を与えて下さい。